home *** CD-ROM | disk | FTP | other *** search
- page ,132
- title STRECPY
- COMMENT $
- Author: Leslie Satenstein
- A form of strcpy() where the result returned is the
- nul terminating character of the first argument. In many cases
- this function is move efficient than the equivalent
- strcpy, followed by strcat.
-
- The assembler code does a strlen followed by a memcpy,
- and makes use of the special string move instructions
- intrinsic to the intel 8088, 80186, 80286, '386 and '486s.
-
- Use as: strecpy(strecpy(target,"first part"),"Second part");
- in place of
- strcat(strcpy(target,"first part"),"Second part");
-
- One of the ways the C code appears is:
- char *strecpy(char *target,const char *src)
- {
- return target+strlen(strcpy(target,src));
- }
- Another way is to do your own looping:
-
- char *strecpy(char *target,const char *src)
- {
- char *cpt,*cps; /* many compilers optimise better
- * when local pointers are declared
- * (locals can be assigned registers)
- */
- cpt=target-1;
- cps=src-1;
- do
- {
- *++cpt = *++src; /* copy first, ask questions later */
- } while(*cpt!='\0');
- return cpt;
- }
-
- $
-
- ; Requires MASM 5.1 or later or equivalent
- ;
- ; Assemble with: MASM /Mx /z ...
- ; TASM /jMASM /mx /z ...
-
- % .MODEL memodel,C ;Add model support via command
- ;line macros, e.g.
- ;MASM /Dmemodel=LARGE,
- ;MASM /Dmemodel=SMALL, etc.
- PUBLIC STRECPY
-
- .DATA
- .CODE
- if @DataSize
- strecpy proc uses si di ds,target:FAR ptr byte,src:FAR ptr byte
- les di,src ; load es:di with src
- mov si,di ; put copy to bx:si
- mov bx,es
- else
- strecpy proc uses si di,target:NEAR ptr byte,src:NEAR ptr byte
- mov di,ds ; make es same as ds
- mov es,di
- mov di,src
- mov si,di ; put copy to es:si
- endif
- xor ax,ax ; scan for the nul at end of string
- mov cx,-1
- repne scasb
- not cx ; cx = strlen(src)+1 ;
- if @Datasize
- les di,target ; this is where copy is to begin
- mov dx,es ; dx has segment, di has offset to target
- mov ds,bx ; ds:si have pointer to src
- else
- mov di,target ; this is where copy is to begin
- endif
- test di,1 ; if we are on odd address, do one byte move
- jz on_even
- movsb ; now, prepare to move words at a
- dec cx ;time to target
- on_even:
- shr cx,1 ; carry flag has remainder after divide by 2
- rep movsw ; move this many words
- jnc fini ; if no carry, we are finished
- movsb
- fini:
- xchg di,ax ; set up return value, dx has seg value
- dec ax ; backup to the nul character
- ret
- strecpy endp
- end
-